Newer
Older
Simple-Multiplayer-Unity3D / Multiplayer Project / Library / PackageCache / [email protected] / Editor / UI / DialogWithCheckBox.cs
using UnityEditor;
using UnityEngine;

using Codice.Client.Common;

namespace Unity.PlasticSCM.Editor.UI
{
    internal class DialogWithCheckBox : PlasticDialog
    {
        protected override Rect DefaultRect
        {
            get
            {
                var baseRect = base.DefaultRect;
                return new Rect(baseRect.x, baseRect.y, 535, baseRect.height);
            }
        }

        internal static GuiMessage.GuiMessageResponseButton Show(
            string title,
            string message,
            string positiveButtonText,
            string neutralButtonText,
            string negativeButtonText,
            MultiLinkLabelData dontShowAgainContent,
            EditorWindow parentWindow,
            out bool checkBoxValue)
        {
            checkBoxValue = false;

            DialogWithCheckBox dialog = Create(
                title,
                message,
                positiveButtonText,
                neutralButtonText,
                negativeButtonText,
                dontShowAgainContent);

            ResponseType result = dialog.RunModal(parentWindow);
            if (result == ResponseType.Cancel || result == ResponseType.None)
                return GuiMessage.GuiMessageResponseButton.Neutral;

            checkBoxValue = dialog.mCheckBox;
            if (result == ResponseType.Ok)
                return GuiMessage.GuiMessageResponseButton.Positive;

            return GuiMessage.GuiMessageResponseButton.Negative;
        }

        protected override string GetTitle()
        {
            return mTitle;
        }

        protected override void OnModalGUI()
        {
            DoMainContentSection();

            DoButtonsArea();

            DoCheckboxSection();
        }

        void DoMainContentSection()
        {
            using (new EditorGUILayout.VerticalScope())
            {
                GUILayout.Label(
                    mTitle,
                    UnityStyles.Dialog.MessageTitle);

                GUILayout.Space(3f);

                GUILayout.Label(
                    mMessage,
                    UnityStyles.Dialog.MessageText);
            }
        }

        void DoButtonsArea()
        {
            using (new EditorGUILayout.VerticalScope())
            {
                GUILayout.Space(25f);

                using (new EditorGUILayout.HorizontalScope())
                {
                    GUILayout.FlexibleSpace();

                    if (Application.platform == RuntimePlatform.WindowsEditor)
                    {
                        DoPositiveButton();
                        DoNegativeButton();
                        DoNeutralButton();
                        return;
                    }

                    DoNegativeButton();
                    DoNeutralButton();
                    DoPositiveButton();
                }
            }
        }

        void DoPositiveButton()
        {
            GUILayout.Space(6f);

            if (!AcceptButton(mPositiveButtonText,
                30))
                return;

            OkButtonAction();
        }

        void DoNegativeButton()
        {
            if (string.IsNullOrEmpty(mNegativeButtonText))
                return;

            GUILayout.Space(6f);

            if (!NormalButton(mNegativeButtonText))
                return;

            ApplyButtonAction();
        }

        void DoNeutralButton()
        {
            if (string.IsNullOrEmpty(mNeutralButtonText))
                return;

            GUILayout.Space(6f);

            if (!NormalButton(mNeutralButtonText))
                return;

            CancelButtonAction();
        }

        void DoCheckboxSection()
        {
            GUILayout.Space(22f);

            Rect backgroundRect = new Rect(0, GUILayoutUtility.GetLastRect().yMax, position.width, 50);

            EditorGUI.DrawRect(backgroundRect, UnityStyles.Colors.DarkGray);

            GUILayout.Space(4f);

            using (new EditorGUILayout.HorizontalScope())
            {
                mCheckBox = EditorGUILayout.ToggleLeft(
                    string.Empty,
                    mCheckBox,
                    EditorStyles.boldLabel);
                GUILayout.FlexibleSpace();
            }

            GUILayout.Space(-20);

            using (new EditorGUILayout.HorizontalScope())
            {
                GUILayout.Space(22);
                DrawTextBlockWithLink.ForMultiLinkLabel(mDontShowAgainContent);
            }

            GUILayout.Space(-17);
        }

        static DialogWithCheckBox Create(
            string title,
            string message,
            string positiveButtonText,
            string neutralButtonText,
            string negativeButtonText,
            MultiLinkLabelData dontShowAgainContent)
        {
            DialogWithCheckBox instance = CreateInstance<DialogWithCheckBox>();
            instance.mEnterKeyAction = instance.OkButtonAction;
            instance.mEscapeKeyAction = instance.CancelButtonAction;

            instance.mTitle = title;
            instance.mMessage = message;
            instance.mPositiveButtonText = positiveButtonText;
            instance.mNeutralButtonText = neutralButtonText;
            instance.mNegativeButtonText = negativeButtonText;
            instance.mDontShowAgainContent = dontShowAgainContent;

            return instance;
        }

        string mTitle;
        string mMessage;
        string mPositiveButtonText;
        string mNeutralButtonText;
        string mNegativeButtonText;
        MultiLinkLabelData mDontShowAgainContent;

        bool mCheckBox;
    }
}